package org.duiduo.common.bean.enums;

import java.util.function.Supplier;

/**
 * 枚举服务接口
 *
 * @author liangze
 * @date 2024/1/3 10:40
 */
public interface ITrueEnumService<T> {

    /**
     * 根据主值判断是否为当前枚举类型
     *
     * @param code 值
     * @return 是否为当前枚举类型
     */
    boolean isTrue(T code);

    default boolean isFalse(T code) {
        return !isTrue(code);
    }

    /**
     * 判断为当前枚举类型 则执行 Runnable
     *
     * @param code 值
     * @param run  Runnable
     */
    default void isTrue(T code, Runnable run) {
        if (this.isTrue(code)) {
            run.run();
        }
    }

    /**
     * 判断非当前枚举类型 则执行 Runnable
     *
     * @param code 值
     * @param run  Runnable
     */
    default void isFalse(T code, Runnable run) {
        if (!this.isTrue(code)) {
            run.run();
        }
    }

    /**
     * 判断为当前枚举类型 则执行 Supplier
     *
     * @param code 值
     * @param run  功能接口
     * @param <E>  返回类型
     * @return 返回值
     */
    default <E> E isTrue(T code, Supplier<E> run) {
        return this.isTrue(code) ? run.get() : null;
    }

    /**
     * 判断非当前枚举类型 则执行 Supplier
     *
     * @param code 值
     * @param run  功能接口
     * @param <E>  返回类型
     * @return 返回值
     */
    default <E> E isFalse(T code, Supplier<E> run) {
        return this.isFalse(code) ? run.get() : null;
    }

    /**
     * True 抛异常
     *
     * @param code     值
     * @param supplier 功能接口
     * @param <X>      异常类型
     * @throws X 异常
     */
    default <X extends Throwable> void assertTrue(T code, Supplier<? extends X> supplier) throws X {
        if (this.isTrue(code)) {
            throw supplier.get();
        }
    }

    /**
     * False 抛异常
     *
     * @param code     值
     * @param supplier 功能接口
     * @param <X>      异常类型
     * @throws X 异常
     */
    default <X extends Throwable> void assertFalse(T code, Supplier<? extends X> supplier) throws X {
        if (!this.isTrue(code)) {
            throw supplier.get();
        }
    }

}
